#pragma once

#include "glare.math.Prerequisites.h"

#include <algorithm>
#include <assert.h>

#if GLARE_CXX_11_FEATURES_ENABLED
#	include <functional>
#	include <initializer_list>
#endif

#include <iomanip>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <vector>

#if GLARE_COMPILER & GLARE_COMPILER_MSVC
#	pragma warning (disable : 4482)
#	pragma warning (disable : 4251)
#endif

//#ifdef GRAPHICSBASE_EXPORTS
//#	define DLL_API __declspec(dllexport)
//#else
//#	define DLL_API __declspec(dllimport)
//#endif

#define OGRE_ENDIAN_BIG 123
#define OGRE_ENDIAN OGRE_ENDIAN_BIG

#include "glare.core.Exception.h"

namespace Glare {

	typedef unsigned int uint;
	typedef unsigned int uint32;
	typedef unsigned short uint16;
	typedef unsigned char uchar;
	typedef unsigned char uint8;
	typedef unsigned short ushort;
	typedef unsigned long long ulonglong;

	typedef std::string string;
	typedef std::map<string, string> NameValuePairList;

	class StringUtil
	{
	public : static void toUpperCase( string& str )
			 {
				 std::transform(
					 str.begin(),
					 str.end(),
					 str.begin(),
					 toupper);
			 }
	};

	//template<class T> class SharedPtr : public std::shared_ptr<T> {};

	class ColourValue;

	class MultiRenderTarget;
	class RenderTarget;
	class RenderTargetListener;
	class RenderWindow;

	class DepthBuffer;

	class ComputeContext;
	class DrawContext;
	class RenderSystemStage;
	class InputAssemblerStage;
	class VertexShaderStage;
	class HullShaderStage;
	class DomainShaderStage;
	class GeometryShaderStage;
	class PixelShaderStage;
	class RasterizerStage;
	class RenderTarget;
	class OutputMerger;

	class Log;
	class PlatformWindow;

	class ConstantBufferDescription;
	class ShaderVariableDescription;

	class GpuBuffer;
	class GpuBufferDescription;
	class GpuResourceFactory;
	class PixelShader;
	class Shader;
	class ShaderFactory;
	class ShaderInputDeclaration;
	class GpuVertexBufferBinding;
	class VertexShader;

	class Driver;
	class DriverCapabilities;

	class Texture;
	class TextureDescription;

	class GpuResource;
	class GpuResourceDescription;

	class DrawStateFactory;
	class SamplerState;
	class SamplerStateDescription;

	class ShaderResourceView;
	class ShaderResourceViewDescription;
}